package cn.lcsjsxy.yxz.day.Practice.Reflection;

//反射动态代理

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.Arrays;

// 计算器接口
interface Calculator {
    int add(int a, int b); // 加法
    int subtract(int a, int b); // 减法
}

// 实现类
class BasicCalculator implements Calculator {
    @Override
    public int add(int a, int b) {
        return a + b;
    }
    @Override
    public int subtract(int a, int b) {
        return a - b;
    }
}

// 日志增强的调用处理器
class LoggingInvocationHandler implements InvocationHandler {
    private final Object target;

    public LoggingInvocationHandler(Object target) {
        this.target = target;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        // 方法调用前：打印方法名和参数
        System.out.println("调用方法：" + method.getName() + "，参数：" + (args != null ? Arrays.toString(args) : "[]"));
        // 调用原始方法
        Object result = method.invoke(target, args);
        // 方法调用后：打印返回值
        System.out.println("方法返回值：" + result);
        System.out.println("----------------------"); // 分隔线，使输出更清晰
        return result;
    }
}
// 测试类
class DynamicProxyDemo {
    public static void main(String[] args) {
        // 创建原始计算器对象
        Calculator basicCalculator = new BasicCalculator();
        // 创建调用处理器
        InvocationHandler handler = new LoggingInvocationHandler(basicCalculator);
        // 创建代理对象
        Calculator proxyCalculator = (Calculator) Proxy.newProxyInstance(
                Calculator.class.getClassLoader(),   // 类加载器
                new Class[]{Calculator.class},       // 代理接口
                handler                              // 调用处理器
        );

        // 测试代理对象的add方法
        System.out.println("=== 测试加法 ===");
        int addResult = proxyCalculator.add(10, 5);
        System.out.println("加法结果: " + addResult);
        System.out.println("\n=== 测试减法 ===");
        // 测试代理对象的subtract方法
        int subtractResult = proxyCalculator.subtract(10, 5);
        System.out.println("减法结果: " + subtractResult);
        System.out.println("\n=== 测试边界情况 ===");
        // 测试边界情况
        proxyCalculator.add(-5, 10);
        proxyCalculator.subtract(0, 5);

    }
}
